package com.itfreer.file.service;

import java.io.IOException;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.itfreer.utils.json.JsonUtils;

import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
import javax.ws.rs.core.MediaType;

/**
 * 对象管理服务接口
 */
@Component
@Path("/file/objectManageService")
public class ObjectManageService {
	
	@Autowired
	private IObjectManageService objectManage;

	/**
	 * 对象是否存在
	 * @param bucketName	存储块名称
	 * @param objectKey		对象名称主键
	 */
	@GET
    @Path("/doesObjectExist")
	@Produces(MediaType.APPLICATION_JSON)
	public boolean doesObjectExist(@QueryParam("bucketName") String bucketName, 
			@QueryParam("objectKey") String objectKey){
		return objectManage.doesObjectExist(bucketName, objectKey);
	}
	
	/**
	 * 获取对象名称
	 * @param bucketName	存储块名称
	 * @param prefix		限定返回的object key必须以prefix作为前缀
	 * @param marker		设定结果从marker之后按字母排序的第一个开始返回
	 * @param maxKeys		限定此次返回object的最大数，如果不设定，默认为100，max-keys取值不能大于1000
	 * @return
	 */
	@GET
    @Path("/listObjects")
	@Produces(MediaType.APPLICATION_JSON)
	public String listObjects(@QueryParam("bucketName") String bucketName, 
			@QueryParam("prefix") String prefix, 
			@QueryParam("marker") String marker, 
			@QueryParam("maxKeys") Integer maxKeys){
		List<Map<String, Object>> result = objectManage.listObjects(bucketName, prefix, marker, maxKeys);
		return JsonUtils.toJSONString(result);
	}
	
	/**
	 * 删除对象
	 * @param bucketName	存储块名称
	 * @param objectKey		对象名称主键
	 */
	@DELETE
    @Path("/deleteObject/{bucketName}/{objectKey}")
	public void deleteObject(@PathParam("bucketName") String bucketName, 
			@PathParam("objectKey") String objectKey){
		objectManage.deleteObject(bucketName, objectKey);
	}
	
	/**
	 * 删除多个对象
	 * @param bucketName	存储块名称
	 * @param keys			对象名称主键
	 * @return
	 */
	@SuppressWarnings("unchecked")
	@DELETE
    @Path("/deleteObjects/{bucketName}/{keys}")
	public void deleteObjects(@PathParam("bucketName") String bucketName, 
			@PathParam("keys") String keys){
		List<String> key = null;
		try {
			key = JsonUtils.toBean(keys, List.class);
		} catch (IOException e) {
			e.printStackTrace();
		}
		objectManage.deleteObjects(bucketName, key);
	}
	
	/**
	 * 复制对象
	 * @param sourceBucketName			源存储块名称
	 * @param sourceKey					源对象名称主键
	 * @param destinationBucketName		目标储块名称
	 * @param destinationKey			目标对象名称主键
	 * @return
	 */
	@POST
    @Path("/copyObject")
	public void copyObject(@QueryParam("sourceBucketName") String sourceBucketName, 
			@QueryParam("sourceKey") String sourceKey, 
			@QueryParam("destinationBucketName") String destinationBucketName, 
			@QueryParam("destinationKey") String destinationKey){
		objectManage.copyObject(sourceBucketName, sourceKey, destinationBucketName, destinationKey);
	}
}